<?php
/**
 * CConfig class file.
 * 获取或设置配置数据.
 * @author Huan Song <iphper@yeah.net>
 * @version $Id: CConfig.php 1 2011-01-12 10:18:08Z huan.song $
 * @package system.base
 * @since 2.0
 */
class CConfig
{
	/**
	 * @var array 用户自定义的配置.
	 */
	protected static $_config;
	
	/**
	 * @var string 用户自定义的语言.
	 */
	protected static $_language;
	
	/**
	 * @var string 所有语言包所在目录.
	 */
	protected static $_languagesDir;
	
	/**
	 * 获取用户自定义的配置(数组格式).
	 * <pre>
	 * $config = CConfig::get(); 
	 * 结果: 返回所有配置数据.
	 * 
	 * $config = CConfig::get('db');
	 * 结果: array(
	 * 		'dsn' => 'mysql:host=localhost;dbname=vivo',
	 * 		'username' => 'root',
	 * 		'password' => '',
	 * 		'charset' => 'UTF8',
	 * 		'prefix' => '',
	 * 		'caseFolding' => PDO::CASE_NATURAL
	 * 	);
	 * 
	 * $config = CConfig::get('db', 'dsn');
	 * 结果: 'mysql:host=localhost;dbname=vivo'
	 * </pre>
	 * @param string|null $key1 配置的键名. 如果为null, 返回全部的配置数组. 
	 * @param string|null $key2 配置的键名. 如果为null, 返回配置数组中键名为$key1的数组. 
	 * @return array|string|null 配置的值. 如果key1或者key2不存在, 返回null. 
	 * @see set
	 */
	public static function get($key1 = null, $key2 = null)
	{
		if (null === self::$_config) 
			self::set();
			
		if (null === $key1)
			return self::$_config;
		
		if (isset(self::$_config[$key1]))
		{
			if (null === $key2)
				return self::$_config[$key1];
			
			if (isset(self::$_config[$key1][$key2]))
				return self::$_config[$key1][$key2];
		}
		
		return null;
	}
	
	/**
	 * 设置用户自定义的配置(数组格式).
	 * <pre>
	 * $config = APP_DIR . '/config/main.php';
	 * $config = array();
	 * $config = null;
	 * CConfig::set($config); // 设置所有配置数据.
	 * </pre>
	 * @param string|array|null $config. 
	 * 如果为string, 配置文件路径; 
	 * 如果为array, 配置数据; 
	 * 如果为null, 取默认配置路径为从 APP_DIR . '/config/main.php'
	 * @return boolean.
	 * @throws CConfigException. 如果配置文件路径不存在或者默认配置文件非数组, 抛出异常.
	 * @see get
	 */
	public static function set($config = null)
	{
		if (is_array($config))
		{
			self::$_config = $config;
			return true;
		}
		
		if (null === $config)
			$config = APP_DIR . DS . 'config' . DS . 'main.php';
		
		if (!file_exists($config))
			throw new CConfigException('APP config path(' . $config . ') must be defined');
		
		self::$_config = require_once $config;
		
		if (!is_array(self::$_config))
			throw new CConfigException('APP config(' . self::$_config . ') must be a array');
		
		return true;
	}
	
	/**
	 * 获取项目语言.
	 * <pre>
	 * $language = CConfig::getLanguage($config);
	 * </pre>
	 * @return string 项目语言.
	 * @see setLanguage
	 */
	public static function getLanguage()
	{
		if (null === self::$_language)
			self::setLanguage();
		
		return self::$_language;
	}
	
	/**
	 * 设置项目语言.
	 * <pre>
	 * $language = null;
	 * CConfig::setLanguage($language);
	 * 如果$language === null, 取配置中
	 * 'view' => array(
	 * 		'language' => 'zh_cn', //用户自定义的语言.
	 * 	),
	 * 结果: self::$_language = 'zh_cn'.
	 * </pre>
	 * @param string|null $language. 如果为null, 取用户自定义的配置的语言; 如果配置中没定义, 默认为'zh_cn'.
	 * @see getLanguage
	 */
	public static function setLanguage($language = null)
	{
		if (null === $language)
		{
			$language = self::get('view', 'language');
			if (null === $language)
				$language = 'zh_cn';
		}
		
		self::$_language = $language;
	}
	
	/**
	 * 获取语言包目录.
	 * <pre>
	 * $languageDir = CConfig::getLanguageDir();
	 * </pre>
	 * @return string 语言包目录.
	 * @throws CConfigException. 如果语言包目录不存在, 抛出异常.
	 */
	public static function getLanguageDir()
	{
		$languageDir = self::getLanguagesDir() . DS . self::getLanguage();
		if (!is_dir($languageDir))
			throw new CConfigException('APP config languageDir(' . $languageDir . ') must be a dir');
			
		return $languageDir;
	}
	
	/**
	 * 获取所有语言包所在目录.
	 * <pre>
	 * $languagesDir = CConfig::getLanguagesDir();
	 * </pre>
	 * @return string 所有语言包所在目录.
	 * @see setLanguagesDir
	 */
	public static function getLanguagesDir()
	{
		if (null === self::$_languagesDir)
			self::setLanguagesDir();
		
		return self::$_languagesDir;
	}
	
	/**
	 * 设置所有语言包所在目录.
	 * <pre>
	 * $languagesDir = null;
	 * CConfig::setLanguagesDir($languagesDir);
	 * 如果$languagesDir === null, 取配置中
	 * 'view' => array(
	 * 		'languagesDir' => FRAMEWORK_DIR . '/views', //所有语言包所在目录.
	 * 	),
	 * 结果: self::$_languagesDir = FRAMEWORK_DIR . '/views'.
	 * </pre>
	 * @param string|null $languagesDir. 如果为null, 取用户自定义的配置路径; 如果配置中没定义, 默认为'framework/views'.
	 * @throws CConfigException. 如果所有语言包所在目录不存在, 抛出异常.
	 * @see getLanguagesDir
	 */
	public static function setLanguagesDir($languagesDir = null)
	{
		if (null === $languagesDir)
		{
			$languagesDir = self::get('view', 'languagesDir');
			if (null === $languagesDir)
				$languagesDir = FRAMEWORK_DIR . DS . 'views';
		}
		
		if (!is_dir($languagesDir))
			throw new CConfigException('APP config languagesDir(' . $languagesDir . ') must be a dir');
		
		self::$_languagesDir = $languagesDir;
	}
}
